#include <iostream>
#include <memory>

class Person
{
public:
    Person()
    {
        std::cout<<"构造"<<std::endl;
    }

    ~Person()
    {
        std::cout<<"析构"<<std::endl;
    }

    void show()
    {

    }
};

// class Student
// {
// public:
//     Student()
//     {
//         std::cout<<"构造"<<std::endl;
//     }

//     ~Student()
//     {
//         std::cout<<"析构"<<std::endl;
//     }
// };

// template <typename T>
// class SmartPoint
// {
// public:
//     SmartPoint(T *p):p(p){}
//     ~SmartPoint()
//     {
//         delete p;
//     }
// private:
//     T *p;
// };

int main()
{
    // Person *p = new Person;
    // SmartPoint<Student> p(new Student);



    //*独占指针 
    //! unique_ptr
    std::unique_ptr<Person> p(new Person);
    // std::unique_ptr<Person> p1;
    // p1 = p;//*删除了拷贝构造和赋值运算符重载

    
    //* 在该指针不在指向该内存时，释放内存
    //!     make_unique
    p = std::make_unique<Person>();
    while(1);

    //共享指针
    //允许多个指针指向同一个对象
    //当最后一个指针不再指向该内存，内存释放
    std::shared_ptr<Person> ptr = std::make_shared<Person>();
    std::shared_ptr<Person> ptr2 = ptr;
    std::shared_ptr<Person> ptr3 = ptr2;

    ptr3 = nullptr;
    //引用计数器
    std::cout<<ptr.use_count()<<std::endl;
    
    //裸指针:绝对不能释放
    Person*p = ptr.get();
    return 0;
}